/**
 * @module initWebSocket 初始化
 * @module websocketonopen 连接成功
 * @module websocketonerror 连接失败
 * @module websocketclose 断开连接
 * @module resetHeart 重置心跳
 * @module sendSocketHeart 心跳发送
 * @module reconnect 重连
 * @module sendMsg 发送数据
 * @module websocketonmessage 接收数据
 * @module test 测试收到消息传递
 * @description socket 通信
 * @param {any} url socket地址
 * @param {any} websocket websocket 实例
 * @param {any} heartTime 心跳定时器实例
 * @param {number} socketHeart 心跳次数
 * @param {number} HeartTimeOut 心跳超时时间
 * @param {number} socketError 错误次数
 */

import {
	getToken
} from '@/utils/auth';
// 引入vuex
import store from "@/store/index.js"
// 引入vuex模块
// import XXXX from "@/store/modules/XXXX.js"
import config from "@/config.js"
import {
	dateChange
} from "@/utils/common.js"

let socketUrl = ''; // socket地址
let websocket = null; // websocket 实例
let heartTime = null; // 心跳定时器实例
let socketHeart = 0; // 心跳次数
const HeartTimeOut = 10000; // 心跳超时时间 10000 = 10s
let socketError = 0; // 错误次数
let socketLine = true //socket链接状态
let _that = ""
// 初始化socket
export const initWebSocket = (_this, url) => {
	socketUrl = url;
	_that = _this
	uni.connectSocket({
		url: url + '?Authorization=Bearer ' + getToken() +
			'&clientid=' + config.appInfo.clientId,
	});
	websocketonopen();
	websocketonmessage();
	websocketonerror();
	websocketclose();
	sendSocketHeart();
	return websocket;
};

// socket 连接成功
export const websocketonopen = () => {
	uni.onSocketOpen(function(res) {
		console.log('连接 websocket 成功');
		uni.hideLoading();
		socketLine = true
		resetHeart();
	});
};

// socket 连接失败
export const websocketonerror = () => {
	uni.onSocketError(function(res) {
		socketLine = false
		console.log('WebSocket连接打开失败，请检查！');
		console.log(res);
	});
};

// socket 断开链接
export const websocketclose = () => {
	uni.onSocketClose(function(res) {
		console.log('WebSocket 已关闭！');
	});
};

// socket 重置心跳
export const resetHeart = () => {
	socketHeart = 0;
	socketError = 0;
	clearInterval(heartTime);
	sendSocketHeart();
};

// socket心跳发送
export const sendSocketHeart = () => {
	heartTime = setInterval(() => {
		// 如果连接正常则发送心跳
		if (socketLine) {
			// if (socketHeart <= 30) {
			uni.sendSocketMessage({
				data: JSON.stringify({
					type: 'ping'
				})
			});
			socketHeart = socketHeart + 1;
		} else {
			// 重连
			reconnect();
		}
	}, HeartTimeOut);
};

// socket重连
export const reconnect = () => {
	if (socketError <= 2) {
		clearInterval(heartTime);
		initWebSocket(socketUrl);
		socketError = socketError + 1;
		console.log('socket重连', socketError);
		uni.showToast({
			title: "重新链接服务器",
			icon: 'error'
		})
	} else {
		console.log('重试次数已用完');
		clearInterval(heartTime);
		uni.showToast({
			title: "重新链接失败",
			icon: 'error'
		})
	}
};

// socket 发送数据
export const sendMsg = (data) => {
	uni.sendSocketMessage({
		data: data
	});
};

// socket 接收数据
export const websocketonmessage = () => {
	uni.onSocketMessage(function(res) {
		// 将res.data解析成json格式
		let data = JSON.parse(res.data);
		console.log(data);
		// 监听心跳 （此处不要删除！！！）
		if (data.type == 'heartbeat') {
			resetHeart();
		}
		// 监听心跳 （此处不要删除！！！）
		if (data.type == 'ping') {
			return;
		}
		// 此处可以进行相应处理
		return res.data;
	});
};